package _21_多线程juc.demo01;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * 方法三
 * 1. 自定义线程类 实现 Callable接口,定义返回值泛型，重写 call 方法（该方法的方法体就代表了线程要完成的任务，并且该方法有返回值）
 * 2. new 一个 FutureTask 类，传入 自定义的线程类
 * 3. new 一个 Thread类，传入FutureTask，并 start
 * 4. 通过 futureTask.get() 获取子线程的返回值，调用线程会阻塞
 *
 */
public class MyThread3 implements Callable<String> {

    @Override
    public String call() throws Exception {
        System.out.println("Thread.currentThread().getName() = " + Thread.currentThread().getName());
        System.out.println("hello world");
        return "ok";
    }

    public static void main(String[] args) {
        System.out.println("Thread.currentThread().getName() = " + Thread.currentThread().getName());
        MyThread3 thread3 = new MyThread3();
        FutureTask<String> futureTask = new FutureTask<>(thread3);
        new Thread(futureTask).start();

        try {
            // main 执行到此会阻塞，直至 futureTask 执行完；建议该代码在所有线程执行完后再用，以免影响后面代码执行
            String res = futureTask.get();
            System.out.println(res);
        } catch (Exception e) {
            e.printStackTrace();
        }

        new Thread(new FutureTask<>(thread3)).start();
    }
}
